package view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import model.CiiBay;

/**
 * Klasse dat het totale scherm beheert en kan veranderen
 * @author Marvin
 * @author Jaap
 * @author Yoeri
 * @author Nick
 * @author Dennis
 * @author Yasper
 * @since v1.0
 *
 */

@SuppressWarnings("serial")
public class Totaalscherm extends JPanel implements Observer{

	private JPanel zoekResultatenGebruikers, zoekGebruikerView, blokkeerView, welkomPaneel, banner, zoekPaneel, optiePaneel, zoekResultaatPaneel, topPaneel, centerPaneel, registreerPaneel, inlogPaneel, advertentieAanmaakPaneel, categoriePaneel, mijnArtikelenView, last, lastf;
	private CiiBay ciiBay;
	private JTabbedPane tab;

	public Totaalscherm(CiiBay ciiBay){

		this.ciiBay = ciiBay;
		this.setLayout(new BorderLayout());
		banner = new Banner(ciiBay);
		welkomPaneel = new WelkomSchermView();
		zoekResultaatPaneel = new ZoekResultaatPaneel(ciiBay);
		zoekPaneel = new Zoekpaneel(ciiBay);
		optiePaneel = new OptiePaneel(ciiBay, this);
		registreerPaneel = new RegistreerView(ciiBay);
		inlogPaneel = new InlogPaneel(ciiBay);
		categoriePaneel = new CategorieView(ciiBay);
		mijnArtikelenView = new MijnArtikelenView(ciiBay);
		blokkeerView = new BlokkeerView(ciiBay);
		zoekGebruikerView = new ZoekGebruikerView(ciiBay);
		zoekResultatenGebruikers = new ZoekResultatenGebruikers(ciiBay);
		this.advertentieAanmaakPaneel = new AdvertentieAanmaakPaneel(ciiBay);
		ciiBay.addObserver(this);
		tab = new JTabbedPane();
		last = null;
		lastf = null;

		//top panel gedeelte met banner en zoekpaneel
		topPaneel = new JPanel(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0;
		c.gridy = 0;
		c.gridheight = 3;
		c.gridwidth = 0;
		topPaneel.add(banner, c);
		c.gridy = 6;
		c.gridheight = 2;
		c.gridwidth = 0;
		topPaneel.add(zoekPaneel, c);
		topPaneel.setBackground(Color.ORANGE);

		//centerpanel gedeelte
		centerPaneel = new JPanel(new BorderLayout());
		centerPaneel.add(optiePaneel, BorderLayout.WEST);
		centerPaneel.add(tab, BorderLayout.CENTER);
		tab.setBackground(Color.ORANGE);
		UIManager.put("TabbedPane.tabAreaBackground", Color.ORANGE);
		SwingUtilities.updateComponentTreeUI(tab);
		tab.setOpaque(true);
		last = welkomPaneel;
		tab.add("Welkom", last);
		add(topPaneel, BorderLayout.NORTH);
		add(centerPaneel, BorderLayout.CENTER);

	}

	/**
	 * Deze methode update het totaalscherm als het model (cii-bay) veranderd is. De verandering gaat aan de hand van een meegegeven bericht.
	 * @author Jaap
	 * @author Yasper
	 * @author Yoeri
	 * @author Dennis
	 * @param arg0 De observable
	 * @param arg1 Het bericht dat de verandering bepaalt
	 */
	public void update(Observable arg0, Object arg1) {
		String message = (String) arg1;
		if(message.equals("registreer")){
			updateWindow(registreerPaneel, "Registreer");
		}else if(message.equals("login")){
			updateWindow(inlogPaneel, "Login");
		}else if(message.equals("zoeken")){
			updateWindow(zoekResultaatPaneel, "Zoeken");
		}else if(message.equals("AdvertentieAanmaakView")){
			updateWindow(advertentieAanmaakPaneel, "Advertentie Aanmaken");
		}else if(message.equals("inloggen")){
			updateWindow(welkomPaneel, "Welkom");
		}else if(message.equals("voegCategorieToe")) {
			updateWindow(categoriePaneel, "Categorie Toevoegen");
		}else if(message.equals("nieuwecategorie")) {
			updateWindow(welkomPaneel, "Welkom");
		}else if(message.equals("uitloggen")){
			tab.removeAll();
			updateWindow(welkomPaneel, "Welkom");
		}else if(message.equals("zoekresultaten")){
			updateSearchWindow(zoekResultaatPaneel, "Zoeken");
		}else if(message.equals("advertentieView")){
			updateAdWindow(new AdvertentieView(ciiBay.getGeklikteAdvertentie(), ciiBay), "Advertentie");
		}else if(message.equals("mijnArtikelen")){
			updateWindow(mijnArtikelenView, "Mijn Advertenties");
		}else if(message.equals("blokkeren")) {
			updateWindow(blokkeerView, "Gebruiker Blokkeren");
		}else if(message.equals("welkom")){
			updateWindow(welkomPaneel, "Welkom");
		}else if(message.equals("zoekGebruiker")){
			updateWindow(zoekGebruikerView, "Zoek Gebruiker");
		}else if(message.equals("zoekresultatenGebruikers")) {
			updateWindow(zoekResultatenGebruikers, "Zoek Resultaten Gebruikers");
		}else if(message.equals("totaalOverzicht")) {
			updateWindow(new TotaalOverzicht(ciiBay), "Totaal Overzicht");
		}else if(message.equals("feedbackView")) {
			updateWindow(new FeedbackPaneel(ciiBay.getGeklikteAdvertentie(), ciiBay), "Feedback geven");
		}else if(message.equals("wijzigAdvertentie")) {
			updateWindow(advertentieAanmaakPaneel, "Advertentie wijzigen");
		}else if(message.contains("refresh")){
			refreshWindow(new AdvertentieView(ciiBay.getGeklikteAdvertentie(), ciiBay), message);
		}else if(message.equals("mailbox")){
			mailboxWindow(new MailboxView(ciiBay), "Mailbox");
		}else if(message.contains("bericht")){
			updateBerichtWindow(new BerichtView(ciiBay.getGeklikteBericht(), ciiBay), message);
		}else if(message.contains("FeedbackVanUser")){
			updateFbWindow(new FeedbackVanUserView(ciiBay, ciiBay.getGezochteGebruiker()), "Feedback Overzicht");
		}else if(message.contains("delete")){
			verwijderHuidigeTab(message);
		}else if(message.contains("verwijderTab")){
			verwijderTab(message);
		}

	}
	/**
	 * Verwijdert de tab van de advertentie die verwijderd is
	 * @author Jaap
	 * @param message
	 */
	public void verwijderTab(String message){
		String[] str = message.split(",");
		int tabIndex = -1;
		for(int i = 0; i < tab.getTabCount(); i++){
			if(tab.getTabComponentAt(i) != null){
				if(tab.getTabComponentAt(i).getName() != null){
					if(tab.getTabComponentAt(i).getName().equals(str[1])){
						tabIndex = i;
					}
				}
			}
		}
		if(tabIndex > -1){
			tab.removeTabAt(tabIndex);
		}
	}
	
	/**
	 * Deze methode verwijderd een tab.
	 * @author Yasper & Jaap
	 * @param message
	 */
	public void verwijderHuidigeTab(String message){
		tab.removeTabAt(tab.getSelectedIndex());
		repaint();
		revalidate();
	}
	//update methoden

	/**
	 * Deze methode update de mailbox.
	 * @author Yasper
	 * @param panel, label
	 */
	public void mailboxWindow(MailboxView panel, String label) {
		boolean check = false;
		for(int i = 0; i <tab.getTabCount(); i++){ 
			if(tab.getTitleAt(i).equals("Mailbox")){
				check = true;
				ciiBay.getIngelogtPersoon().getMailbox().addBerichten(ciiBay);
				tab.add(panel, i);
				tab.setTitleAt(i, tab.getTitleAt(i+1));
				tab.setSelectedIndex(i);
				voegSluitknopToe(i);
				tab.getTabComponentAt(i).setName("Mailbox");
				tab.remove(i+1);
				tab.setSelectedIndex(i);
				centerPaneel.repaint();
				panel.update(ciiBay, "inbox");
				panel.revalidate();
				revalidate();
			}
		}
		if(!check){
			tab.add(panel, tab.getTabCount());
			tab.setSelectedComponent(panel);
			voegSluitknopToe(tab.getTabCount()-1);
			ciiBay.getIngelogtPersoon().getMailbox().addBerichten(ciiBay);
			tab.setTitleAt(tab.getTabCount()-1, label);
			panel.setName("Mailbox");
			centerPaneel.add(tab, BorderLayout.CENTER);
			centerPaneel.repaint();
			revalidate();
		}
	}

	/**
	 * Deze methode ververst een scherm.
	 * @author Yoeri
	 * @param panel, message
	 */
	public void refreshWindow(JPanel panel, String message) {
		int j = tab.getTabCount();
		boolean check = false;
		String[] str = message.split(",");
		for(int i = 0; i < tab.getTabCount(); i++ ) {
			if(tab.getTabComponentAt(i)!= null){
				if(tab.getTabComponentAt(i).getName() != null){
					if(tab.getTabComponentAt(i).getName().equals(str[1])){
						j = i;
						check = true;
					}
				}
			}
		}
		if(check){
			tab.add(panel, j);
			tab.setTitleAt(j, tab.getTitleAt(j+1));
			tab.setSelectedIndex(j);
			voegSluitknopToe(j);
			if(panel instanceof AdvertentieView ){
				tab.getTabComponentAt(j).setName(""+ciiBay.getGeklikteAdvertentie().getID());
			} else if (panel instanceof BerichtView) {
				tab.getTabComponentAt(j).setName(""+ciiBay.getGeklikteBericht().getID());
			}
			tab.remove(j+1);

			centerPaneel.add(tab, BorderLayout.CENTER);
			centerPaneel.repaint();
			revalidate();
		}
	}

	/**
	 * Deze methode update ene window
	 * @author Yoeri
	 * @param panel, label
	 */
	public void updateWindow(JPanel panel, String label){
		tab.remove(last);
		tab.add(panel, 0);
		tab.setTitleAt(0, label);
		tab.setSelectedComponent(panel);
		panel.setName("Home");
		last = panel;
		centerPaneel.add(tab, BorderLayout.CENTER);
		centerPaneel.repaint();
		revalidate();
	}

	/**
	 * Deze methode update het zoekscherm.
	 * @author Yoeri
	 * @param panel, label
	 */
	public void updateSearchWindow(JPanel panel, String label){
		tab.remove(lastf);
		tab.add(panel, 1);
		tab.setTitleAt(1, label);
		tab.setSelectedIndex(1);
		tab.setName("zoeken");
		voegSluitknopToe(1);
		lastf = panel;
		centerPaneel.add(tab, BorderLayout.CENTER);
		centerPaneel.repaint();
		revalidate();
	}

	/**
	 * Deze methode update de eerste tab.
	 * @author Yoeri
	 * @param panel, label
	 */
	public void updateFbWindow(JPanel panel, String label){
		boolean gevonden = false;
		int i = tab.getTabCount();
		for(int a = 0; a < tab.getTabCount(); a++) {
			if(!gevonden){
				if(tab.getTabComponentAt(a)!= null){
					if(tab.getTabComponentAt(a).getName() != null){
						if(tab.getTabComponentAt(a).getName().equals(""+ciiBay.getGezochteGebruiker().getID())){
							gevonden = true;
						}
					}
				}
			}
		}

		if(gevonden) {
			refreshWindow(panel, "refresh,"+ciiBay.getGezochteGebruiker().getID());
		} else {
			tab.add(panel, i);
			tab.setTitleAt(i, label);
			tab.setSelectedIndex(i);
			voegSluitknopToe(i);
			tab.getTabComponentAt(i).setName(""+ciiBay.getGezochteGebruiker().getID());

			centerPaneel.add(tab, BorderLayout.CENTER);
			centerPaneel.repaint();
			revalidate();
		}
	}

	/**
	 * Deze methode update een advertentiescherm
	 * @author Yasper
	 * @param panel, label
	 */
	public void updateAdWindow(JPanel panel, String label){
		boolean gevonden = false;
		int i = tab.getTabCount();
		for(int a = 0; a < tab.getTabCount(); a++) {
			if(!gevonden){
				if(tab.getTabComponentAt(a)!= null){
					if(tab.getTabComponentAt(a).getName() != null){
						if(tab.getTabComponentAt(a).getName().equals(""+ciiBay.getGeklikteAdvertentie().getID())){
							gevonden = true;
						}
					}
				}
			}
		}

		if(gevonden) {
			refreshWindow(panel, "refresh,"+ciiBay.getGeklikteAdvertentie().getID());
		} else {
			tab.add(panel, i);
			tab.setTitleAt(i, label);
			tab.setSelectedIndex(i);
			voegSluitknopToe(i);
			tab.getTabComponentAt(i).setName(""+ciiBay.getGeklikteAdvertentie().getID());
			centerPaneel.add(tab, BorderLayout.CENTER);
			centerPaneel.repaint();
			revalidate();
		}
	}

	
	/**
	 * Deze methode update een berichtscherm
	 * @author Yasper
	 * @param panel, label
	 */
	public void updateBerichtWindow(JPanel panel, String label){
		boolean gevonden = false;
		int i = tab.getTabCount();
		for(int a = 0; a < tab.getTabCount(); a++) {
			if(!gevonden){
				if(tab.getTabComponentAt(a)!= null){
					if(tab.getTabComponentAt(a).getName() != null){
						if(tab.getTabComponentAt(a).getName().equals(""+ciiBay.getGeklikteBericht().getID())){
							gevonden = true;
						}
					}
				}
			}
		}

		if(gevonden) {
			refreshWindow(panel, "bericht,"+ciiBay.getGeklikteBericht().getID());
		} else {
			tab.add(panel, i);
			tab.setTitleAt(i, "Bericht");
			tab.setSelectedIndex(i);
			voegSluitknopToe(i);
			tab.getTabComponentAt(i).setName(""+ciiBay.getGeklikteBericht().getID());

			centerPaneel.add(tab, BorderLayout.CENTER);
			centerPaneel.repaint();
			revalidate();
		}
	}

	/**
	 * Deze methode voegt een sluitknop toe aan een tabblad
	 * @author Yoeri
	 * @param i
	 */
	private void voegSluitknopToe(int i) {
		tab.setTabComponentAt(i, new Sluitknop(tab));
	}
}
